<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*
            注意，then的链式调用是很重要的，也是promise的精髓，如果你面试大厂这个是必考的，所以务必重视起来。

            Promise.then()返回的是一个【新的promise实例】，他的值和状态由什么决定？
                1.简单表达：由then()所指定的回调函数执行的结果决定
                2.详细表达：
                    (1) 如果then所指定的回调返回的是一个非promise的值a
                            那么【新的promise实例】状态为成功(fulfilled)，成功的value为a
                    (2) 如果then所指定的回调返回的是一个promise实例p:
                            那么【新的promise实例】的状态、值都与p一致
                    (3) 如果then所指定的回调抛出异常
                            那么【新promise实例】状态为rejected，reason为抛出的那个异常
        */

        let p = new Promise((resolve,reject)=>{
            resolve('success')
        })

        // 首先，p这个实例肯定是一个成功的promise实例，所以他的then方法一定是执行成功的那个回调
        p
        .then(
            (value)=>{
                console.log('成功了 '+value);
                // 注意，这里返回了一个失败的promise实例，所以下一层肯定是走失败的回调函数，而且失败的原因也是和这里的一样的'404 not found'
                return Promise.reject('404 not found')
            },
            (err)=>{
                console.log('失败了 '+err);
            }
        )
        .then(
            (value)=>{
                console.log('成功了 '+value);
            },
            (err)=>{
                console.log('失败了 '+err);
                // 注意，虽然返回的是false看上去好像是负面的东西，但是我们刚才讲了，只要返回的是个非promise实例的值，那么下一层走的一定是成功的回调
                return false
            }
        )
        .then(
            (value)=>{
                console.log('成功了 '+value);
                // 注意，这里c是不存在的，所以会抛出异常，我们上面讲了，只要抛出异常，那么下一层是一定走失败的回调的，而且失败的原因就是这个异常本身
                return console.log(c)
            },
            (err)=>{
                console.log('失败了 '+err);
            }
        )
        .then(
            (value)=>{
                console.log('成功了 '+value);
            },
            (err)=>{
                console.log('失败了 '+err);
            }
        )
    </script>
</body>
</html>